package InnerClass;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2022-06-26
 * Time: 10:59`
 * 1.内部类里不能定义静态成员变量，如果要定义则需要加上final修饰
 * 2.内部类里不能定义静态方法
 * 非static的内部类，在外部类加载的时候并不会加载它，所以它里面不能有静态变量或者静态方法
 * 3.内部类实例化
 * 内部类相当于外部类的一个实例成员，依靠外部类的对象而存在
 * 所以先要有外部类的对象才能实例化内部类
 * 内部类实例化方式一：
 * OuterClass outerClass = new OuterClass();
 * OuterClass.InnerClass innerClass = outerClass.new InnerClass();
 *内部类实例化方式二：
 * OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
 *4.访问内部类与外部类同名的成员变量：外部类.this.变量名
 * 5.访问内部类与外部类同名的静态成员变量： 外部类.变量
 *
 *
 */
/**
 *
 */
class OuterClass{
    private int data1 = 1;
    public int data2 = 2;
    static int data3 = 3;

    class InnerClass{
        private int data1 = 4;
        public int data5 = 5;
        public final static int data3 = 6;
        public void fun(){
            //实例内部类可以直接访问外部类的成员和方法
            System.out.println("外部类"+OuterClass.this.data1);// 实例内部类与外部类的实例变量名相同
            System.out.println(this.data1);
            System.out.println(data3);
            System.out.println("外部类"+OuterClass.data3);//实例内部类与外部类的static变量名相同
            System.out.println(data2);
            fun1();
        }

    }
    //外部类访问实例内部类的成员必须通过实例化内部类的对象来实现
    public void fun1(){
        InnerClass innerClass = new InnerClass();
        innerClass.fun();
    }

}
public class Test {
    public static void main(String[] args) {
        //实例内部类实例化方式1
//        OuterClass outerClass = new OuterClass();//必须通过外部类的引用来实现
//        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        //实例内部类实例化方式2
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
        //System.out.println(innerClass.data5);
        innerClass.fun();
    }


}
